import axios from "axios";

// 正式地址
let prodUrl = "https://wx-component.adjacentech.com/merchant/jsapi-sign";
let _requestConfig = {
  wxOpenUrl: "", // wx accesstoken 认证获取接口
  wxShareUrl: "", // wx 分享链接接口
};

let _shareUserId: string | number = ""; // 分享者openid

// 获取分享链接
const getShareLink = (url: string) => {
  if (!_shareUserId) {
    console.warn("没有配置shareUserId，请先在init中传入 userId 参数");
  }
  // return shareLink
  return `${_requestConfig.wxShareUrl}/${_shareUserId}/${getLocalUrl(url)}`;
};

// 获取当前hash值
const getHash = () => {
  let { hash } = window.location;
  const queryIndex = hash.indexOf("?");
  return queryIndex > -1 ? "" : hash;
};

// 获取当前页面在地址
const getLocalUrl = (url: string) => {
  // 去掉external里的这些特殊参数，防止将分享者的个人信息带入前端
  const external = [
    "openid",
    "actualopenid",
    "memberid",
    "isactivated",
    "tracktoken",
    "appid",
    "tracktoken",
    "accesstoken",
    "registerorigin",
    "redirecturl",
    "referrer",
  ]; // 都使用小写做比对

  let path = url.split("?")[0];
  let urlQuery: string = url.split("?")[1];

  if (urlQuery) {
    let tempUrlQuery = urlQuery.split("&");

    tempUrlQuery = tempUrlQuery?.filter((item) => {
      return !external.some((e) => {
        return item.toLowerCase().indexOf(e) > -1;
      });
    });

    urlQuery = tempUrlQuery.join("&");
    path += urlQuery ? `$${urlQuery}` : "";
  }

  return path.replace(/\//gi, "@");
};

const hasProperty = (obj: any, key: any) => {
  if (obj[key] === true || obj[key] === "yes") {
    return true;
  } else {
    return false;
  }
};

// 分享方法
export function share() {
  const openId = window.sessionStorage.getItem("openId");
  console.log("openId", openId);
  // 分享的参数
  const shareParams = {
    title: "UPM胶黏材料", // 分享标题
    desc: "欢迎观看UPM胶黏材料医药标签解决方案直播。",
    link: `https://scrm.adjacentech.com/scrm/upm/user_info/share/${openId}`, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
    imgUrl: "https://scrm.adjacentech.com/upm/logo.png",
  };

  console.log("shareParams", shareParams);
  // config信息验证后会执行ready方法，所有接口调用都必须在config接口获得结果之后，config是一个客户端的异步操作，所以如果需要在页面加载时就调用相关接口，则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口，则可以直接调用，不需要放在ready函数中。
  // @ts-ignore
  jWeixin.updateAppMessageShareData({
    ...shareParams,
    success: function () {
      // 设置成功
      console.log("updateAppMessageShareData 设置成功");
    },
  });

  // @ts-ignore
  jWeixin.updateTimelineShareData({
    ...shareParams,
    success: function () {
      // 设置成功
      console.log("updateTimelineShareData 设置成功");
    },
  });
}

export function configAndHideMenu({ appId }: { appId: string }) {
  // @ts-ignore
  if (!jWeixin) {
    throw new Error(
      "项目没有引入jweixin，请先引入最新版本。[https://res.wx.qq.com/open/js/jweixin-1.6.0.js]"
    );
  }

  if (!_requestConfig.wxOpenUrl || !_requestConfig.wxShareUrl) {
    throw new Error(
      "请求链接未配置，请先使用 init 方法 配置 wxOpenUrl、wxShareUrl"
    );
  }

  console.log("授权链接", window.location.href.replace(getHash(), ""));

  return new Promise((resolve) => {
    // 请求分享需要的参数，参数要除去hash值在链接
    axios
      .post(_requestConfig.wxOpenUrl, {
        url: window.location.href.replace(getHash(), ""),
        appId,
      })
      .then((response) => {
        const rData = response.data;
        if (response.status !== 200 || (rData && rData.code !== 200)) {
          return;
        }

        const { data } = rData;

        // @ts-ignore
        jWeixin.config({
          debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
          appId: data.appId, // 必填，公众号的唯一标识
          timestamp: data.timestamp, // 必填，生成签名的时间戳
          nonceStr: data.nonceStr, // 必填，生成签名的随机串
          signature: data.signature, // 必填，签名
          jsApiList: [
            "checkJsApi",
            "hideMenuItems",
            "updateAppMessageShareData",
            "updateTimelineShareData",
          ], // 必填，需要使用的JS接口列表
        });

        // config完成后的回调
        // @ts-ignore
        jWeixin.ready(function () {
          // resolve(true);
          // @ts-ignore
          jWeixin.checkJsApi({
            jsApiList: [
              "hideMenuItems",
              "updateAppMessageShareData",
              "updateTimelineShareData",
            ], // 需要检测的JS接口列表，所有JS接口列表见附录2,
            success: function (res: any) {
              console.log("checkJsApi Result", res.checkResult);
              resolve(true);
              const { checkResult } = res;

              const hideMenuList = [
                "menuItem:copyUrl",
                "menuItem:editTag",
                "menuItem:delete",
                "menuItem:originPage",
                "menuItem:readMode",
                "menuItem:openWithQQBrowser",
                "menuItem:openWithSafari",
                "menuItem:share:email",
                "menuItem:share:brand",
                "menuItem:share:qq",
                "menuItem:share:QZone",
                "menuItem:share:facebook",
                "menuItem:share:weiboApp",
              ];

              const hasUpdateAppMessage = hasProperty(
                checkResult,
                "updateAppMessageShareData"
              );
              const hasUpdateTimelineShareData = hasProperty(
                checkResult,
                "updateTimelineShareData"
              );

              // 没有权限则隐藏转发按钮
              if (!hasUpdateAppMessage) {
                hideMenuList.push("menuItem:share:appMessage");
              }
              if (!hasUpdateTimelineShareData) {
                hideMenuList.push("menuItem:share:timeline");
              }

              // @ts-ignore
              jWeixin.hideMenuItems({
                menuList: hideMenuList, // 要隐藏的菜单项，只能隐藏“传播类”和“保护类”按钮
              });
              // 以键值对的形式返回，可用的api值true，不可用为false
              // 如：{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
            },
          });
        });

        // @ts-ignore
        jWeixin.error(function (e: any) {
          console.error(e);
        });
      });
  });
}

export function init({
  wxShareUrl = "",
  env = "staging",
  userId = "",
  wxOpenUrl = prodUrl,
}: {
  wxShareUrl: string;
  env: "staging" | "production";
  userId: string;
  wxOpenUrl: string;
}) {
  _requestConfig = {
    wxOpenUrl,
    wxShareUrl,
  };

  _shareUserId = userId;
}
